// Create by wxc on 2020/07/13

// 给定两个数组，编写一个函数来计算它们的交集。

// 示例 1：
// 输入：nums1 = [1,2,2,1], nums2 = [2,2]
// 输出：[2,2]

// 示例 2:
// 输入：nums1 = [4,9,5], nums2 = [9,4,9,8,4]
// 输出：[4,9]


// 说明：
// 输出结果中每个元素出现的次数，应与元素在两个数组中出现次数的最小值一致。
// 我们可以不考虑输出结果的顺序。

// 进阶：
// 如果给定的数组已经排好序呢？你将如何优化你的算法？
// 如果 nums1 的大小比 nums2 小很多，哪种方法更优？
// 如果 nums2 的元素存储在磁盘上，磁盘内存是有限的，并且你不能一次加载所有的元素到内存中，你该怎么办？


// time: 96ms(18.20%) cache: 38.1MB(75.51%)
/**
 * @param {number[]} nums1
 * @param {number[]} nums2
 * @return {number[]}
 */
// var intersect = function(nums1, nums2) {
//   let res = [];

//   nums1.map(item => {
//     let index = nums2.indexOf(item);

//     if (index >= 0) {
//       res.push(item);
//       nums2.splice(index, 1);
//     }
//   });

//   return res;
// };

// const nums1 = [1, 2, 2, 1],
//   nums2 = [2, 2];

// console.log(intersect(nums1, nums2));


//
var intersect = function(nums1, nums2) {
  const map = {};
  const res = [];
  for (const num1 of nums1) { // 存下nums1数字的出现次数
    if (map[num1]) {
      map[num1]++;
    } else {
      map[num1] = 1;
    }
  }
  for (const num2 of nums2) { // 遍历nums2看看有没有数字在nums1出现过
    const val = map[num2];
    if (val > 0) {            // 出现过
      res.push(num2);         // 推入res数组
      map[num2]--;            // 匹配掉一个，就少了一个
    }
  }
  return res;
};

const nums1 = [1, 2, 2, 1],
  nums2 = [2, 2];

console.log(intersect(nums1, nums2));